{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iPpI7RaYoZuE"
      },
      "source": [
        "##### Copyright 2018 The TensorFlow Authors."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "hro2InpHobKk"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "U9i2Dsh-ziXr"
      },
      "source": [
        "# Основы настройки: тензоры и операции"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Hndw-YcxoOJK"
      },
      "source": [
        "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://www.tensorflow.org/tutorials/customization/basics\"><img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />Смотрите на TensorFlow.org</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/docs-l10n/blob/master/site/ru/tutorials/customization/basics.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Запустите в Google Colab</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://github.com/tensorflow/docs-l10n/blob/master/site/ru/tutorials/customization/basics.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />Изучайте код на GitHub</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a href=\"https://storage.googleapis.com/tensorflow_docs/docs-l10n/site/ru/tutorials/customization/basics.ipynb\"><img src=\"https://www.tensorflow.org/images/download_logo_32px.png\" />Скачайте ноутбук</a>\n",
        "  </td>\n",
        "</table>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "8a2322303a3f"
      },
      "source": [
        "Note: Вся информация в этом разделе переведена с помощью русскоговорящего Tensorflow сообщества на общественных началах. Поскольку этот перевод не является официальным, мы не гарантируем что он на 100% аккуратен и соответствует [официальной документации на английском языке](https://www.tensorflow.org/?hl=en). Если у вас есть предложение как исправить этот перевод, мы будем очень рады увидеть pull request в [tensorflow/docs](https://github.com/tensorflow/docs) репозиторий GitHub. Если вы хотите помочь сделать документацию по Tensorflow лучше (сделать сам перевод или проверить перевод подготовленный кем-то другим), напишите нам на [docs-ru@tensorflow.org list](https://groups.google.com/a/tensorflow.org/forum/#!forum/docs-ru)."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6sILUVbHoSgH"
      },
      "source": [
        "Это вводное руководство по TensorFlow, в котором показано, как:\n",
        "\n",
        "* Импортировать необходимый пакет\n",
        "* Создавать и использовать тензоры\n",
        "* Использовать ускорение графического процессора\n",
        "* Демонстрация `tf.data.Dataset`"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "z1JcS5iBXMRO"
      },
      "source": [
        "## Импорт TensorFlow\n",
        "\n",
        "Сначала импортируйте модуль `tensorflow`. Начиная с TensorFlow версии 2, активное выполнение включено по умолчанию. Это обеспечивает более интерактивный интерфейс для TensorFlow, детали которого мы обсудим гораздо позже."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "vjBPmYjLdFmk"
      },
      "outputs": [],
      "source": [
        "import tensorflow as tf"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "H9UySOPLXdaw"
      },
      "source": [
        "## Тензоры\n",
        "\n",
        "Тензор - это многомерный массив. Подобно объектам `ndarray` из NumPy , объекты` tf.Tensor` имеют тип данных и размерность. Кроме того, `tf.Tensor`ы могут находиться в памяти ускорителя (например, в графическом процессоре). TensorFlow предлагает богатую библиотеку операций ([tf.add](https://www.tensorflow.org/api_docs/python/tf/add), [tf.matmul](https://www.tensorflow.org/api_docs/python/tf/matmul), [tf.linalg.inv](https://www.tensorflow.org/api_docs/python/tf/linalg/inv) и т. д.), которые принимают и возвращают объекты `tf.Tensor`. Эти операции автоматически преобразуют нативные типы Python в тензоры, например:\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "code",
        "id": "ngUe237Wt48W"
      },
      "outputs": [],
      "source": [
        "print(tf.add(1, 2))\n",
        "print(tf.add([1, 2], [3, 4]))\n",
        "print(tf.square(5))\n",
        "print(tf.reduce_sum([1, 2, 3]))\n",
        "\n",
        "# Перегрузка операторов также поддерживается\n",
        "print(tf.square(2) + tf.square(3))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "IDY4WsYRhP81"
      },
      "source": [
        "Каждый `tf.Tensor` имеет размерность(shape) и тип данных(dtype):"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "srYWH1MdJNG7"
      },
      "outputs": [],
      "source": [
        "x = tf.matmul([[1]], [[2, 3]])\n",
        "print(x)\n",
        "print(x.shape)\n",
        "print(x.dtype)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "eBPw8e8vrsom"
      },
      "source": [
        "Наиболее очевидные различия между массивами NumPy и `tf.Tensor`ами:\n",
        "\n",
        "1. Тензоры могут обрабатываться в памяти ускорителя(например, GPU, TPU).\n",
        "2. Тензоры неизменяемы."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Dwi1tdW3JBw6"
      },
      "source": [
        "### Совместимость с NumPy\n",
        "\n",
        "Преобразование между TensorFlow `tf.Tensor` и NumPy` ndarray` очень простое:\n",
        "\n",
        "* Операции TensorFlow автоматически преобразуют ndarrays NumPy в Tensor.\n",
        "* Операции NumPy автоматически преобразуют тензоры в ndarrays NumPy.\n",
        "\n",
        "Тензоры можно явно преобразовать в `ndarrays` NumPy с использованием метода `.numpy()`. Эти преобразования обычно дешевы, поскольку массив и tf.Tensor по возможности совместно используют базовое представление памяти. Однако совместное использование базового представления не всегда возможно, поскольку tf.Tensor может размещаться в памяти графического процессора, в то время как массивы NumPy всегда поддерживаются памятью хоста, а преобразование включает копирование из графического процессора в память хоста."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "lCUWzso6mbqR"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "\n",
        "ndarray = np.ones([3, 3])\n",
        "\n",
        "print(\"Операции TensorFlow автоматически конвертируют ndarray в tf.Tensor\")\n",
        "tensor = tf.multiply(ndarray, 42)\n",
        "print(tensor)\n",
        "\n",
        "\n",
        "print(\"И операции NumPy автоматически конвертируют tf.Tensor в ndarray\")\n",
        "print(np.add(tensor, 1))\n",
        "\n",
        "print(\"Метод .numpy() явно конвертирует tf.Tensor в numpy ndarray\")\n",
        "print(tensor.numpy())"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "PBNP8yTRfu_X"
      },
      "source": [
        "## GPU ускорение\n",
        "\n",
        "Многие операции TensorFlow ускоряются для вычислений с использованием графического процессора. Без каких-либо аннотаций TensorFlow автоматически решает, использовать ли для операции GPU или CPU - при необходимости копируя тензор между CPU и памятью GPU. Тензоры, создаваемые операцией, обычно поддерживаются памятью устройства, на котором выполнялась операция, например:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "code",
        "id": "3Twf_Rw-gQFM"
      },
      "outputs": [],
      "source": [
        "x = tf.random.uniform([3, 3])\n",
        "\n",
        "print(\"Доступен ли графический процессор: \"),\n",
        "print(tf.config.experimental.list_physical_devices(\"GPU\"))\n",
        "\n",
        "print(\"Тензор на GPU #0:  \"),\n",
        "print(x.device.endswith('GPU:0'))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vpgYzgVXW2Ud"
      },
      "source": [
        "### Имена устройств\n",
        "\n",
        "Свойство `Tensor.device` предоставляет полное строковое имя устройства, на котором размещается содержимое тензора. Это имя кодирует многие детали, такие как идентификатор сетевого адреса хоста, на котором выполняется эта программа, и устройства внутри этого хоста. Это требуется для распределенного выполнения программы TensorFlow. Строка заканчивается на `GPU: <N>`, если тензор помещается на `N`-й графический процессор хоста."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ZWZQCimzuqyP"
      },
      "source": [
        "### Явное размещение на устройстве\n",
        "\n",
        "В TensorFlow *размещение* определяет устройство, на котором будут выполняться(размещаться) отдельные операции. Как уже упоминалось, при отсутствии явных указаний TensorFlow автоматически решает, на каком устройстве выполнять операцию, и при необходимости копирует тензоры на это устройство. Однако операции TensorFlow могут быть явно размещены на определенных устройствах с помощью диспетчера контекста `tf.device`, например:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "RjkNZTuauy-Q"
      },
      "outputs": [],
      "source": [
        "import time\n",
        "\n",
        "def time_matmul(x):\n",
        "  start = time.time()\n",
        "  for loop in range(10):\n",
        "    tf.matmul(x, x)\n",
        "\n",
        "  result = time.time()-start\n",
        "\n",
        "  print(\"10 loops: {:0.2f}ms\".format(1000*result))\n",
        "\n",
        "# Принудительное выполнение на CPU\n",
        "print(\"On CPU:\")\n",
        "with tf.device(\"CPU:0\"):\n",
        "  x = tf.random.uniform([1000, 1000])\n",
        "  assert x.device.endswith(\"CPU:0\")\n",
        "  time_matmul(x)\n",
        "\n",
        "# Принудительное выполнение на GPU #0 если устройство доступно\n",
        "if tf.config.experimental.list_physical_devices(\"GPU\"):\n",
        "  print(\"On GPU:\")\n",
        "  with tf.device(\"GPU:0\"): # Or GPU:1 for the 2nd GPU, GPU:2 for the 3rd etc.\n",
        "    x = tf.random.uniform([1000, 1000])\n",
        "    assert x.device.endswith(\"GPU:0\")\n",
        "    time_matmul(x)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "o1K4dlhhHtQj"
      },
      "source": [
        "## Наборы данных(датасеты)\n",
        "\n",
        "В этом разделе используется [API `tf.data.Dataset`](https://www.tensorflow.org/guide/datasets) для создания конвейера подачи данных в вашу модель. API `tf.data.Dataset` используется для построения эффективных, сложных конвейеров ввода из простых, многократно используемых частей, которые будут подавать пакеты данных в циклы обучения или оценки вашей модели."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "zI0fmOynH-Ne"
      },
      "source": [
        "### Создание датасета\n",
        "\n",
        "Создайте *исходный* набор данных, используя одну из фабричных функций, например [`Dataset.from_tensors`](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#from_tensors), [`Dataset.from_tensor_slices`](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#from_tensor_slices) или с использованием объектов, которые читают из файлов, таких как [`TextLineDataset`](https://www.tensorflow.org/api_docs/python/tf/data/TextLineDataset) или [`TFRecordDataset`](https://www.tensorflow.org/api_docs/python/tf/data/TFRecordDataset). \n",
        "См. [Руководство по наборам данных TensorFlow](https://www.tensorflow.org/guide/datasets#reading_input_data) для получения дополнительной информации."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "F04fVOHQIBiG"
      },
      "outputs": [],
      "source": [
        "ds_tensors = tf.data.Dataset.from_tensor_slices([1, 2, 3, 4, 5, 6])\n",
        "\n",
        "# Создаем CSV файл\n",
        "import tempfile\n",
        "_, filename = tempfile.mkstemp()\n",
        "\n",
        "with open(filename, 'w') as f:\n",
        "  f.write(\"\"\"Line 1\n",
        "Line 2\n",
        "Line 3\n",
        "  \"\"\")\n",
        "\n",
        "ds_file = tf.data.TextLineDataset(filename)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vbxIhC-5IPdf"
      },
      "source": [
        "### Применение трансформаций\n",
        "\n",
        "Используйте функции преобразования данных, такие как [`map`](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#map), [`batch`](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#batch), или [`shuffle`](https://www.tensorflow.org/api_docs/python/tf/data/Dataset#shuffle)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "uXSDZWE-ISsd"
      },
      "outputs": [],
      "source": [
        "ds_tensors = ds_tensors.map(tf.square).shuffle(2).batch(2)\n",
        "\n",
        "ds_file = ds_file.batch(2)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "A8X1GNfoIZKJ"
      },
      "source": [
        "### Итерация\n",
        "\n",
        "Объекты `tf.data.Dataset` поддерживают итерацию для перебора записей:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ws-WKRk5Ic6-"
      },
      "outputs": [],
      "source": [
        "print('Elements of ds_tensors:')\n",
        "for x in ds_tensors:\n",
        "  print(x)\n",
        "\n",
        "print('\\nElements in ds_file:')\n",
        "for x in ds_file:\n",
        "  print(x)"
      ]
    }
  ],
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "collapsed_sections": [],
      "name": "basics.ipynb",
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
